package com.gjt.URI_URL;

import java.net.URI;
import java.net.URISyntaxException;


/**
 * Created with Intel IDEA.
 *
 *  URI的详细介绍 模式：模式特定部分：片段
 *  Uri(统一资源标识符):由模式，授权机构（用户名，口令，主机，端口），路径，查询 ，片段（从技术上讲它是URL的引用而不是URL）
 *              构造方法: URI(String uri):如果 uri 不遵循规则就抛出URISyntaxException
 *                      URI(String scheme, String schemeSpecificPart, String path , String fragment):需要一个模式特定部分，
 *                          主要用于非层次URI,片段标识符中禁止的字符会自动转义
 *                      URI(String scheme, String host, String path, String fragment): 用于层次URI
 *                      URI(String scheme, String authority, String path, String query,String fragment):
 *                      URI(String scheme, String userInfo,String host, int port, String path, String query,String fragment):
 *              静态方法： 你确认你的uri 没问题用并且不会抛出异常
 *                      URI.create(String uri)
 *
 *              获取URI的内容的方法：parseServerAuthority() 强制重新解析授权机构 如果不解析，就无法授权机构的各个部分，无法解析时抛出URISyntaxException
 *                               isAbsolute() 判断uri 是否为绝对uri
 *                               isOpaque() 判断uri 是否为层次uri
 *                               getScheme() 获取uri 的模式
 *                               getSchemeSpecificPart()  获取uri 的模式特定部分（不对特定部分的转义字符解码）
 *                               getRawSchemeSpecificPart() 获取uri 的模式特定部分（对特定部分的转义字符解码）
 *                               getFragment() 获取uri 的片段部分（不对片段部分的转义字符解码）
 *                               getRawFragment() 获取uri 的片段部分（对片段部分的转义字符解码）
 *
 *               获取层次uri中内容的方法：getAuthority() 获取uri 的授权机构（不对特定部分的转义字符解码）
 *                                    getRawAuthority() 获取uri 的授权机构（对特定部分的转义字符解码）
 *                                    getFragment() 获取uri 的片段标识符（不对特定部分的转义字符解码）
 *                                    getRawFragment() 获取uri 的片段标识符（对特定部分的转义字符解码）
 *                                    getHost() 获取uri 的主机
 *                                    getQuery() 获取uri 的查询字段 （不对特定部分的转义字符解码）
 *                                    getRawQuery() 获取uri 的查询字段 （对特定部分的转义字符解码）
 *                                    getUserInfo() 获取uri 的用户信息（不对特定部分的转义字符解码）
 *                                    getRawUserInfo() 获取uri 的用户信息（对特定部分的转义字符解码）
 *
 *                解析相对uri: 方法可以转换相对和绝对
 *                            resolve(URI uri)
 *                            resolve(String uri)
 *                            relativize(URI uri)
 *                URI的相等性和比较： 模式和授权机构不区别大小写  其余部分区别（URI只能和URI类进行比较）
 *                              URI实现了Comparable 比较顺序为
 *                              模式->（层次< 非层次的）->都是非层次，根据模式特定部分排序 ->片段标识符 ->都是层次uri 授权机构排序（授权机
 *                                  构根据用户信息，主机不区分大小，端口排序）->路径 -> 查询字符串 -> 片段标识符
 *                将URI转成字符串： toString不进行解码 和 toASCIIString() 进行解码
 *  注意：如果省略了模式则uri引用是相对的； 如果省略了片段标识符则uri 是个纯uri
 * @Auther: gjt
 * @Date: 2024/3/22 16:48
 */
public class Uri {

    public static void main(String[] args) {
        try{
            URI uri1 = new URI("http://gjt1314.xyz/");
            URI Uri2 = new URI("http","//www.baidu.com",null);
            URI uri3 = new URI("http","www.baidu.com","/java/user/index.html","today");
            URI uri = URI.create("http://gjt1314yy.xyz");
            URI relative = new URI("image/log.png");
            URI relative1 = new URI("root/user/");

            // 判断uri 是否为绝对uri
            boolean absolute = uri.isAbsolute();
            System.out.println("绝对"+ absolute);

            //判断uri 是否为层次uri
            boolean opaque = uri.isOpaque();
            System.out.println("层次"+ opaque);

            // 获取uri 的模式
            String scheme = uri.getScheme();
            System.out.println(scheme);

            // 获取uri 的模式特定部分（不对特定部分的转义字符解码）
            String schemeSpecificPart = uri.getSchemeSpecificPart();
            System.out.println(schemeSpecificPart);

            // 获取uri 的模式特定部分（对特定部分的转义字符解码）
            String rawSchemeSpecificPart = uri.getRawSchemeSpecificPart();
            System.out.println(rawSchemeSpecificPart);

            // 获取uri 的片段部分（不对片段部分的转义字符解码）
            String fragment = uri.getFragment();
            System.out.println(fragment);

            // 获取uri 的片段部分（对片段部分的转义字符解码）
            String rawFragment = uri.getRawFragment();
            System.out.println(rawFragment);


            /**
             *  层次uri 的方法
             */
            URI uri2 = uri3.parseServerAuthority();

            // 获取uri的授权机构
            String authority = uri2.getAuthority();
            String rawAuthority = uri2.getRawAuthority();
            System.out.println(authority);
            System.out.println(rawAuthority);

            String fragment1 = uri2.getFragment();
            String rawFragment1 = uri2.getRawFragment();
            System.out.println(fragment1);
            System.out.println(rawFragment1);

            String host = uri2.getHost();
            System.out.println(host);

            String path = uri2.getPath();
            String rawPath = uri2.getRawPath();
            System.out.println(path);
            System.out.println(rawPath);

            int port = uri2.getPort();
            System.out.println(port);

            String query = uri2.getQuery();
            String rawQuery = uri2.getRawQuery();
            System.out.println(query);
            System.out.println(rawQuery);

            String userInfo = uri2.getUserInfo();
            String rawAuthority1 = uri2.getRawAuthority();
            System.out.println(userInfo);
            System.out.println(rawAuthority1);

            /**
             * 绝对uri
             */
            // uri1 =http://gjt1314.xyz/   relative=image/log.png   resolve = http://gjt1314.xyz/image/log.png
            // 将uri的参数与这个uri进行比较，并构造出新的URI，这个对象包装了一个绝对uri
            URI resolve = uri1.resolve(relative);
            System.out.println(resolve);

            // relative=image/log.png  relative1=root/user/  resolve1=root/user/image/log.png
            URI resolve1 = relative1.resolve(relative);
            System.out.println(resolve1);


            // relativize= image/log.png
            URI absolute1 = new URI("http://gjt1314.xyz/image/log.png");
            URI top =new URI("http://gjt1314.xyz/");
            URI relativize = absolute1.relativize(top);
            System.out.println(relativize);

        } catch (URISyntaxException e) {
            throw new RuntimeException(e);
        }
    }

}
